(async function () {
    const Sequelize = require('sequelize')

    const sequelize = new Sequelize('lang1427', 'root', 'king+5688', {
        host: 'localhost',
        port: 5690,
        dialect: 'mysql',
        timezone: '+08:00'
    })


    // 定义一个User表  
    const UserModel = sequelize.define('user', {
        // 属性为字段名称，属性值是一个对象，是该字段名称的描述（如：类型，是否为空，自动增长...）   
        id: {
            // 类型通过Sequelize类中的datatypes获取
            type: Sequelize.INTEGER(10),
            allowNull: false,
            primaryKey: true,
            autoIncrement: true
        },
        name: {
            type: Sequelize.STRING(255),
            defaultValue: '',
            allowNull: false
        },
        age: {
            type: Sequelize.TINYINT,
            allowNull: false,
            defaultValue: 1
        },
        gender: {
            type: Sequelize.ENUM(['男', '女']),
            allowNull: false,
            defaultValue: '男'
        }
    }, {
        timestamps: false,
        paranoid: false,
        freezeTableName: true
    })


    // 定义一个comment表
    const CommentModel = sequelize.define('comment', {
        id: {
            type: Sequelize.INTEGER(10),
            primaryKey: true,
            autoIncrement: true,
            allowNull: false
        },
        uid: {              // 其他表的字段，把当前字段定义为外键  
            type: Sequelize.INTEGER(10),
            allowNull: false,
            defaultValue: 0,
            references: {
                model: UserModel,         // 关联UserModel表
                key: 'id'            // 关联UserModel表的id字段
            }
        },
        content: {
            type: Sequelize.STRING(255),
            allowNull: false,
            defaultValue: ''
        }
    }, {
        timestamps: false,
        paranoid: false,
        freezeTableName: true
    })

    /**   查找当前id = 1 的评论 和 对应id评论的user信息  */
    CommentModel.belongsTo(UserModel, {
        foreignKey: 'uid'
    })
    let data = await CommentModel.findByPk(1, {
        include: UserModel      // 需要包含的表
    })
    console.log(`
        评论id: ${data.get('id')}
        评论内容：${data.get('content')}
        评论人: ${data.user.get('name')}
    `)



    /** 查找当前用户 和 对应用户的所有评论信息*/
    UserModel.hasMany(CommentModel, {
        foreignKey: 'uid'
    })
    let data2 = await UserModel.findByPk(2, {
        include: CommentModel
    })
    let commentlist = data2.comments.map(mes => {
        return mes.get('content')
    })
    console.log(`
        评论人id： ${data2.get('id')}
        评论人： ${data2.get('name')}
        评论信息：${commentlist}
    `)


    /* 创建一条数据： new UserModel()   或  UserModel.build() */
    // let mm = UserModel.build({
    //     name: '槑槑',
    //     age: 18,
    //     gender: '女'
    // })
    // mm.save()   // 保存数据


    /* 修改一条数据 */
    // let mm = await UserModel.findOne({ id: 1 })
    // mm.update({ age: 20 })


    /* 删除一条数据 */
    // let mm = await UserModel.findOne({ id: 1 })
    // mm.destroy()


    /*
        findOrCreate()       创建并查找 或 查找
        findAll()            查找所有数据
    */
    //    let mm = await UserModel.findOrCreate({          
    //        where:{
    //            name:'黄蓉'
    //        }
    //    })
    //    console.log(mm)


    // let data = await UserModel.findAll()
    // let data_name = data.map(item=>{
    //     return item.get('name')
    // })
    // console.log(data_name)

    // 条件查询：Sequelize.OP    
    // let mm = await UserModel.findAll({
    //     where:{
    //         name:{
    //             [Sequelize.Op.eq] : '黄蓉'          // 条件查询name = 黄蓉
    //         }
    //     }
    // })
    // let mm = await UserModel.findAll({
    //     order:[
    //         ['age','desc']
    //     ]
    // })
    // let res =  mm.map(item=>{
    //     return item.get('name')
    // })
    // console.log(res)

    // let res = await UserModel.sum('age')
    // console.log(res)


    // try {
    //     await sequelize.authenticate()
    //     console.log('Connection has been established successfully')
    // } catch (e) {
    //     console.error('Unable to connect to the database: ', e)
    // }
})()